#include "Int_EEPROM.h"
#include "STRING.H"

/** 写数据 */
#define EEPROM_ADDER_W 0XA0

/** 读数据 */
#define EEPROM_ADDER_R 0XA1

#define EEPROM_PAGE    16

sbit B_7 = B ^ 7;
sbit B_6 = B ^ 6;

/**
 * @brief 发送数据
 *
 * @param str_data 数据字符串
 * @param e_adder 数据地址
 * @param str_data_lenth 数据字符串长度
 */
bit Int_EEPROM_Transmit_All(u8 *str_data, u8 e_adder, u8 str_data_lenth)
{
    bit ask;
    u8 i;

    Int_I2c_Start();
    // 发送
    Int_I2c_Transmit(EEPROM_ADDER_W);
    ask |= Int_I2c_Reception_Ack();

    // 发送内部数据地址
    Int_I2c_Transmit(e_adder);
    ask |= Int_I2c_Reception_Ack();

    for (i = 0; i < str_data_lenth; i++) {
        // 发送数据
        Int_I2c_Transmit(str_data[i]);
        ask |= Int_I2c_Reception_Ack();
    }

    Int_I2c_Stop();

    return ask;
}

/**
 * @brief 发送数据
 *
 * @param str_data  数据字符串
 */
bit Int_EEPROM_Transmit_Data_Array(u8 *str_data, u8 adder, u8 str_data_lenth)
{
    u8 ask;
    // 每次写入数据的长度
    u8 data_lenth;
    while (1) {
        // 地址剩余的长度 = 16 - 已经用了地址数据
        data_lenth = EEPROM_PAGE - adder % EEPROM_PAGE;
        // 地址剩余的长度 > 数据的长度
        if (data_lenth >= str_data_lenth) {
            // 直接写入数据
            ask |= Int_EEPROM_Transmit_All(str_data, adder, str_data_lenth);
            return ask;
        } else {
            // 不够需要分页写入
            ask |= Int_EEPROM_Transmit_All(str_data, adder, data_lenth);

            // 数据的长度 + 已经写入的长度
            str_data = str_data + data_lenth;
            // 数据长度 - 已经写入的长度
            str_data_lenth = str_data_lenth - data_lenth;
            // 地址 = 地址+ 向后的长度
            adder = adder + data_lenth;
        }
        Delay_ms(5);
    }
}

/**
 * @brief 读取是数据
 *
 * @param str_data
 * @param adder
 * @param str_data_lendth 数据长度
 */
void Int_EEPROM_Reception_Data(u8 *str_data, u8 e_adder, u8 str_data_lendth)
{
    u8 i;
    bit ask;
    // 先进行伪写
    Int_I2c_Start();
    // 发送
    Int_I2c_Transmit(EEPROM_ADDER_W);
    ask |= Int_I2c_Reception_Ack();
    // 发送内部数据地址
    Int_I2c_Transmit(e_adder);
    ask |= Int_I2c_Reception_Ack();
    Int_I2c_Stop();
    Delay_ms(5);

    // 读取数据
    Int_I2c_Start();
    Int_I2c_Transmit(EEPROM_ADDER_R);
    ask |= Int_I2c_Reception_Ack();

    // 读取数据
    for (i = 0; i < str_data_lendth; i++) {
        str_data[i] = Int_I2c_Reception();
        // 最后一个数据
        if (i == (str_data_lendth - 1)) {
            // 结束发送 1
            Int_I2c_Transmit_Ack(1);
        } else {
            Int_I2c_Transmit_Ack(0);
        }
    }
    str_data[str_data_lendth] = '\0';
}